package com.example.service;

import com.example.dao.UserInfoDao;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.example.entity.UserInfo;
import com.example.exception.CustomException;
import com.example.common.ResultCode;
import com.example.vo.UserInfoVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.hutool.crypto.SecureUtil;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 用户信息服务层
 * <p>
 * 处理用户账号相关的核心业务逻辑，包含用户增删改查、分页查询、登录验证等功能
 * </p>
 */
@Service
public class UserInfoService {

    @Resource
    private UserInfoDao userInfoDao;

    /**
     * 注册新用户
     *
     * @param userInfo 用户实体对象（必须包含name和password字段）
     * @return 插入后的完整用户实体（包含自增ID）
     * @throws CustomException 当用户名已存在时抛出业务异常
     * @implNote
     * 1. 唯一性校验：检查用户名是否已存在
     * 2. 密码安全：空密码自动填充默认密码"123456"并加密
     * 3. 数据持久化：使用insertSelective进行部分字段插入
     */
    public UserInfo add(UserInfo userInfo) {
        // 唯一校验
        int count = userInfoDao.checkRepeat("name", userInfo.getName(), null);
        if (count > 0) {
            throw new CustomException("1001", "用户名\"" + userInfo.getName() + "\"已存在");
        }
        // 2. 密码处理
        if (StringUtils.isEmpty(userInfo.getPassword())) {
            // 默认密码123456
            userInfo.setPassword(SecureUtil.md5("123456"));
        } else {
            userInfo.setPassword(SecureUtil.md5(userInfo.getPassword()));
        }
        // 3. 插入数据库
        userInfoDao.insertSelective(userInfo);
        return userInfo;
    }

    /**
     * 物理删除用户（根据主键ID）
     *
     * @param id 用户ID
     * @throws org.springframework.dao.EmptyResultDataAccessException 当ID不存在时抛出空结果异常
     */
    public void delete(Long id) {
        userInfoDao.deleteByPrimaryKey(id);
    }

    /**
     * 更新用户信息（仅更新非空字段）
     *
     * @param userInfo 包含更新字段的用户实体（必须包含有效ID）
     * @throws IllegalArgumentException 当传入对象ID为空时抛出参数异常
     */
    public void update(UserInfo userInfo) {
        userInfoDao.updateByPrimaryKeySelective(userInfo);
    }

    /**
     * 根据ID查询用户详情
     *
     * @param id 用户ID
     * @return 对应的用户实体对象（找不到时返回null）
     */
    public UserInfo findById(Long id) {
        return userInfoDao.selectByPrimaryKey(id);
    }

    /**
     * 查询所有用户信息（特殊实现）
     *
     * @return 用户视图对象列表（通过硬编码参数"all"触发全量查询）
     */
    public List<UserInfoVo> findAll() {
        return userInfoDao.findByName("all");
    }

    /**
     * 分页条件查询用户
     *
     * @param name     用户名关键词（支持模糊查询）
     * @param pageNum  当前页码（从1开始计数）
     * @param pageSize 每页显示记录数（建议值：10-100）
     * @param request  HTTP请求对象（预留参数，当前未使用）
     * @return 分页结果包装对象（包含总记录数、当前页数据等）
     * @throws IllegalArgumentException 当pageNum<1或pageSize<1时抛出参数异常
     */
    public PageInfo<UserInfoVo> findPage(String name, Integer pageNum, Integer pageSize, HttpServletRequest request) {
        PageHelper.startPage(pageNum, pageSize);
        List<UserInfoVo> all = userInfoDao.findByName(name);
        return PageInfo.of(all);
    }

    /**
     * 根据用户名精确查询用户
     *
     * @param name 用户名
     * @return 匹配的用户视图对象（包含扩展信息，找不到时返回null）
     */
    public UserInfoVo findByUserName(String name) {
        return userInfoDao.findByUsername(name);
    }

    /**
     * 用户登录验证
     *
     * @param username 用户名
     * @param password 密码（明文）
     * @return 验证通过的用户实体（包含权限信息等）
     * @throws CustomException 当账号不存在或密码错误时抛出
     */
    public UserInfo login(String username, String password) {
        UserInfo userInfo = userInfoDao.findByUsername(username);
        if (userInfo == null) {
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }
        if (!SecureUtil.md5(password).equalsIgnoreCase(userInfo.getPassword())) {
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }
        return userInfo;
    }

}
